// function * foo() {
//     console.log('start')
//     try {
//         const res = yield 'foo'
//         console.log(res)
//     } catch (e) {
//         console.log(e)
//     }
    
// }

// const generator = foo()
// const result = generator.next()


// // console.log(generator)
// // console.log(result)
// // console.log(generator.return())
// // console.log(generator.throw())

// generator.throw(new Error('Generator error'))

// 异步方案

function ajax (url) {
    return new Promise(function (resolve, reject) {
        var xhr = new XMLHttpRequest()
        xhr.open('GET', url)
        xhr.responseType = 'json'
        xhr.onload = function () {
            if (this.status === 200) {
                resolve(this.response)
            } else {
                reject(new Error(this.statusText))
            }
        }
        xhr.send()
    })
}

function * main() {
    try {
        const users = yield ajax('/api/users.json')
        console.log(users)
        const posts = yield ajax('/api/posts.json')
        console.log(posts)
        const urls = yield ajax('/api/urls1.json')
        console.log(urls)
    } catch(e) {
        console.log(e)
    }

}

// const g = main()

// const result = g.next()
// request(result)
// result.value.then(data => {
    
//     const result2 = g.next(data)
//     console.log(result2)
//     result2.value.then(data => {
//         const result3 = g.next(data)

//     })
// })

// 递归
// function request (result) {
//     result.value.then(data => {
//         const resultNext = g.next(data)
//         console.log(resultNext)
//         if(resultNext.done) return
//         request(resultNext)
//     })
// }

// function request (result) {
//     if(result.done) return
//     result.value.then(data => {
//         const resultNext = g.next(data)
//         console.log(resultNext)
//         request(resultNext)
//     }, error => {
//         g.throw(error)
//     })
// }

function co (generator) {
    const g = generator()

    function request (result) {
        if(result.done) return
        result.value.then(data => {
            const resultNext = g.next(data)
            console.log(resultNext)
            request(resultNext)
        }, error => {
            g.throw(error)
        })
    }

    const result = g.next()
    request(result)
}

co(main)